//
//  MKUIPopoverView.h
//  MKUI
//  带箭头的弹出框，在指定的容器中，箭头指定某一个区域，显示弹窗内容。可设定点击空白区域时，自动隐藏。
/**
 UIPopoverArrowDirectionUp:
 __/\_
 |         |
 |____|
 
 
 UIPopoverArrowDirectionDown:
 _____
 |         |
 |__  _|
   V
 
 UIPopoverArrowDirectionLeft:
 _____
 |          |
<     |
 |__ __|
 
 
 UIPopoverArrowDirectionRight:
 _____
 |          |
 |          >
 |__ __|
*/
//  Created by 苏尚进 on 2024/11/13.
//  Copyright © 2024 moon. All rights reserved.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@class MKUIPopoverBorderView;
@interface MKUIPopoverView : UIView
@property(nonatomic,strong,nonnull) UIView *contentView;//弹出框中的内容视图
@property(nonatomic,assign) UIEdgeInsets contentInsets;//contentView的外边距,默认为(10,10,10,10)

@property(nonatomic,assign) UIEdgeInsets popoverMargins;//弹出框与其容器的边距，默认为(10,10,10,10)

@property(nonatomic,readonly) UIPopoverArrowDirection popoverArrowDirection;//箭头方向
@property(nonatomic,assign) UIPopoverArrowDirection permittedArrowDirections;//期望的箭头方向，如果当前方向上空间不够布局时，会尝试其他方向。最终方向取属性popoverArrowDirection
@property(nonatomic,assign) CGFloat arrowSpacing;//与箭头指向的目标区域的间隔,默认为5
@property(nonatomic,assign) CGFloat arrowHeight;//up、down时为箭头的高度值，left、right时为宽度值。默认为7

@property(nonatomic,assign) BOOL shouldAutoDismiss;//点击容器的空白区域，是否隐藏弹窗，默认为YES
@property(nonatomic,strong,nullable) NSArray<UIView *> *passthroughViews;//当shouldAutoDismiss=YES时，会覆盖一个透明视图在容器中，点击时会自动取消弹窗。该属性允许用户在弹出框显示时,还可以点击该属性中的视图.该数组弱引用这些view，从不必担心循环引用。

@property(nonatomic,assign) CGRect arrowPointToRect;//箭头指定的目标区域,坐标系为self.superView
@property(nonatomic,copy,nullable) void(^whenPresented)(MKUIPopoverView *popoverView);//present弹出框后的回调
@property(nonatomic,copy,nullable) void(^whenDismissed)(MKUIPopoverView *popoverView);//dismiss弹出框后的回调

/// 计算在指定容器中，指向内部视图的arrowPointToRect值
/// - Parameters:
///   - pointToView: 被指向的视图
///   - containerView: pop弹窗所在的容器
+ (CGRect)arrowPointToRectFrom:(UIView *)pointToView inContainerView:(UIView *)containerView;

@property(nonatomic,readonly) BOOL popoverVisible;//弹出框是否显示
- (void)setNeedsReload;
/// 刷新弹出窗的显示
/// - Parameters:
///   - animated: 是否动画
///   - completion: 完成回调
- (void)reloadWithAnimated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;

/// 在containerView中，显示弹出窗。
/// - Parameters:
///   - containerView: 弹出窗所要添加的容器视图
///   - animated: 是否动画
///   - completion: 完成回调
- (void)presentPopoverInContainerView:(UIView *)containerView animated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;

/// 取消弹出窗
/// - Parameters:
///   - animated: 是否动画
///   - completion: 完成回调
- (void)dismissPopoverAnimated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;

@property(nonatomic,readonly) __kindof MKUIPopoverBorderView *borderView;//弹出窗的背景边框视图，作用是绘制出带箭头的圆角矩形图形

/// 产生弹出窗背景视图
+ (MKUIPopoverBorderView *)createBorderView;

/// 布局弹出窗的frame
- (void)layoutSelfInContainerView;

/// 计算contentView的合适尺寸
/// - Parameter size: contentView的外层容器尺寸
- (CGSize)contentViewSizeThatFits:(CGSize)size;
@end

//绘制带箭头的圆角矩形图形的视图，layer带有一点阴影
@interface MKUIPopoverBorderView : UIView
@property(nonatomic,assign) CGSize upArrowSize;//向上的箭头的尺寸值。默认为(9,7)
@property(nonatomic,assign) CGFloat cornerRadius;//圆角边框的圆角半径，默认为7
@property(nonatomic,strong,nullable) UIColor *borderColor;//图形的边框颜色，默认为黑色
@property(nonatomic,strong,nullable) UIColor *fillColor;//图形的填充颜色，默认为黑色
@property(nonatomic,assign) CGFloat lineWidth;//线宽,默认为1
@property(nonatomic,assign) UIPopoverArrowDirection arrowDirection;//箭头指向方向
@property(nonatomic,assign) CGPoint arrowPoint;//箭头指定的点，坐标系为本视图内部坐标
- (UIBezierPath *)createBorderPath;//产生带箭头的圆角矩形图形闭合路径

/// 绘制带箭头的圆角矩形图形
/// - Parameter rect: draw:方法传入的rect参数
- (void)drawArrowBorder:(CGRect)rect;
@end

/// 绘制带箭头的圆角矩形图形路径的工具类
/**
__/\_
|         |
|____|
*/ 
@interface MKArrowUIBezierPath : NSObject
@property(nonatomic,assign) CGRect bounds;//整个图形的边框，包含圆角矩形和箭头的区域
@property(nonatomic,assign) CGSize upArrowSize;//向上的箭头的尺寸值，绘制时，其他方向的箭头会按情况进行处理
@property(nonatomic,assign) CGFloat cornerRadius;//圆角边框的圆角半径
@property(nonatomic,assign) CGPoint arrowPoint;//箭头指定的点，坐标系为本视图内部坐标
@property(nonatomic,assign) CGFloat lineWidth;//线宽
@property(nonatomic,assign) UIPopoverArrowDirection arrowDirection;//箭头方向

/// 产生带箭头的圆角矩形图形路径
- (UIBezierPath *)createArrowPath;
@end

@interface MKUIPopoverView(UIView)
/// 在UIWindow中展示弹出框，箭头指向view
/// - Parameters:
///   - view: 箭头指向的视图
///   - animated: 是否动画
///   - completion: 完成回调
- (void)presentPopoverInWindowPointToView:(UIView *)view animated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;

/// 在containerView窗口中，显示弹出框，箭头指向view
/// - Parameters:
///   - view: 箭头指向的视图
///   - containerView: 容器
///   - animated: 是否动画
///   - completion: 完成回调   
- (void)presentPopoverPointToView:(UIView *)view inContainerView:(UIView *)containerView animated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;
@end

@interface UIView(MKUIPopoverView)
- (void)mk_dismissUIWindowPopoverAnimated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;//查找当前UIWindow的子视图中，是否有popview，如果有取消该popview弹窗框
- (void)mk_dismissSubViewPopoverAnimated:(BOOL)animated completion:(void (^ __nullable)(BOOL finished))completion;//查找当前视图的子视图中，是否有popview，如果有取消该popview弹窗框
@end

NS_ASSUME_NONNULL_END
